﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <string.h>
//int main(void)
//{
//	int i = 0;
//	char str[] = "Test String";
//	while (str[i])
//	{
//		if (islower(str[i]) )
//		{
//			str[i] =toupper(str[i]);
//		}
//		i++;
//	}
//	printf("%s", str);
//	return 0;
//}
// 
//1.计数器模式模拟实现strlen
//size_t my_strlen(const char* ptr)
//{
//	//提高代码健壮性
//	size_t len = 0;
//	assert(ptr != NULL);
//	while (*ptr != '\0')
//	{
//		len++;
//		ptr++;
//	}
//	return len;
//}
//2.指针-指针模拟实现strlen
//size_t my_strlen(const char* ptr)
//{
//	assert(ptr != NULL);
//	const char *p = ptr;
//	//写成“\0”会运行失败
//	while (*p != '\0')	p++;
//	return p - ptr;
//}
//3.函数递归模拟实现strlen
//size_t my_strlen(const char* ptr)
//{
//	assert(ptr != NULL);
//	if (*ptr == '\0')	return 0;
//	else return 1 + my_strlen(ptr + 1);
//}
//int main(void)
//{
//	char str[] = "abcdef";
//	size_t len = my_strlen(str);
//	printf("%zd\n", len);
//
//	return 0;
//}
//int main(void)
//{
//	char arr1[] = "hello";		//源头必须要有\0
//	char* p = "xxxxxxxxxx";		//常量字符串不能被修改
//	char arr2[] = "xxxxxxxxx";	//目标空间必须足够大
//	strcpy(arr2, arr1);			//'\0'也会拷贝进去
//	return 0;
//}
//模拟实现strcpy
/*
	strcpy:返回的是目标空间的起始地址，方便实现链式访问
*/
//char* my_strcpy(char* arr2, const char* arr1)
//{
//	assert(arr2 && arr1);
//	char* ret = arr2;
//	while (*arr2++ = *arr1++);//先使用再加加
//	return ret;
//}
//int main(void)
//{
//	char arr1[] = "hello";		//源头必须要有\0
//	char arr2[] = "xxxxxxxxx";	//目标空间必须足够大
//	my_strcpy(arr2, arr1);		//'\0'也会拷贝进去
//	printf("%s\n", arr2);
//	printf("%s\n", my_strcpy(arr2, arr1));
//	return 0;
//}
//char* my_strcat(char* arr1, const char* arr2)
//{
//	assert(arr1 && arr2);
//	char* ret = arr1;
//	while (*arr1 != '\0') arr1++;
//	while (*arr1++ = *arr2++);
//	return ret;
//}
//int main(void)
//{
//	char arr1[20] = "hello ";//⽬标空间必须有⾜够的⼤，能容纳下源字符串的内容。
//	char arr2[] = "bit";
//	my_strcat(arr1, arr2);//自己给自己追加会导致死循环
//	printf("%s\n", arr1);
//	return 0;
//}
//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0') return 0;
//		str1++;
//		str2++;
//	}
//	return (*str1 - *str2);
//}
//int main(void)
//{
//	char str1[] = "hello";
//	char str2[] = "hello";
//	int ret = my_strcmp(str1, str2);
//	printf("%d\n", ret);
//	return 0;
//}
//int main(void)
//{
//	char arr1[20] = "abcdef";
//	char arr2[20] = "xxxxxxxxx";
//	strncpy(arr2, arr1, 3);//没有拷贝\0
//	strncpy(arr2, arr1, 8);//多余补0
//	return 0;
//}
//int main(void)
//{
//	//如果source 指向的字符串的⻓度⼩于num的时候，只会将字符串中到\0 的内容追加到destination指向的字符串末尾
//	char arr1[20] = "abc\0def";
//	char arr2[20] = "xxxxxxxxx";
//	strncat(arr1, arr2, 3);//字符串后面进行追加
//	return 0;
//}
//int main(void)
//{
//	char arr1[20] = "abcdef";
//	char arr2[20] = "ab";
//	int ret=strncmp(arr1, arr2, 4);//c与\0比较,提前结束原则
//	printf("%d\n", ret);
//	return 0;
//}
/*
	sep参数指向⼀个字符串，定义了⽤作分隔符的字符集合
	• 第⼀个参数指定⼀个字符串，它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。
	• strtok函数找到str中的下⼀个标记，并将其⽤ \0 结尾，返回⼀个指向这个标记的指针。（注：
	strtok函数会改变被操作的字符串，所以被strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。）
	• strtok函数的第⼀个参数不为 NULL ，函数将找到str中第⼀个标记，strtok函数将保存它在字符串中的位置。
	• strtok函数的第⼀个参数为 NULL ，函数将在同⼀个字符串中被保存的位置开始，查找下⼀个标记。
	• 如果字符串中不存在更多的标记，则返回 NULL 指针
*/
int main()
{
	char arr[] = "192.168.6.111";
	char* sep = ".";
	char* str = NULL;
	//切割BUFF数组函数
	//此函数具有记忆功能，应该会有static存在
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s\n", str);
	}
	return 0;
}